package com.qf.sl.youshare.utils;

/**
 * Created by IDEA
 * User : sl
 * on 2015/2/5.
 * 10:31
 */

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.StatusLine;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.*;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Set;

/**
 * Http网络请求的工具类,包含了 GET POST PUT DELETE
 * 这四种请求方法的支持
 */
public class HttpTools {

    //TODO GET请求

    /**
     * 执行 GET 请求,
     * @param url 请求的路径参数
     * @return byte[] 网络数据
     */
    public static byte[] get(String url){

        byte[] ret = null;
        if (url != null) {
            HttpGet request = new HttpGet(url);

            ret = processRequestBase(request);

        }
        return ret;
    }

    /**
     * Delete 请求
     * @param url 请求的网址
     * @return byte[] 网络获取的数据
     */
    public static byte[] delete(String url){
        byte[] ret = null;

        if (url != null) {
            HttpDelete request = new HttpDelete(url);
            ret = processRequestBase(request);
        }

        return ret;
    }

    private static byte[] processRequestBase(HttpRequestBase request) {
        byte[] ret = null;
        if (request != null) {
            HttpClient client = new DefaultHttpClient();
            try {
                HttpResponse response = client.execute(request);
                StatusLine statusLine = response.getStatusLine();
                if (statusLine.getStatusCode() == 200){
                    HttpEntity entity = response.getEntity();

                    ret = EntityUtils.toByteArray(entity);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return ret;
    }

    //TODO POST 请求

    /**
     * 执行 POST 请求
     * POST 请求要提交数据,提交数据的方式,
     * 本方法采用 提交 key=value&key=value的形式
     * 这种数据格式就是网页中,form 表单提交的数据格式
     * @param url 请求的网址
     * @param params HashMap 包含的参数, 也就是 key=value 的集合
     * @param encoding 编码格式
     * @return byte[]
     */
    public static byte[] post(String url, HashMap<String, String> params, String encoding){
        byte[] ret = null;
        if (url != null) {
            HttpPost request = new HttpPost(url);

            ret = processEntityRequest(request, params, encoding);

        }
        return ret;
    }

    /**
     * 执行 POST 请求
     * POST 请求要提交数据,提交数据的方式,
     * 本方法采用 提交 key=value&key=value的形式
     * 这种数据格式就是网页中,form 表单提交的数据格式
     * @param url 请求的网址
     * @param params HashMap 包含的参数, 也就是 key=value 的集合
     * @return
     */
    public static byte[] post(String url, HashMap<String, String> params){
        return post(url,params,"utf-8");
    }

    /**
     * PUT 请求
     * @param url 网络请求的地址
     * @param params
     * @param encoding
     * @return
     */
    public static byte[] put(String url, HashMap<String, String> params, String encoding){
        byte[] ret = null;

        if (url != null) {
            HttpPut request = new HttpPut(url);
            ret = processEntityRequest(request, params, encoding);
        }

        return ret;
    }

    /**
     * 本方法实现了 POST请求与PUT请求,发送key=value形式的
     * @param request
     * @param params
     * @param encoding
     * @return
     */
    private static byte[] processEntityRequest(
            HttpEntityEnclosingRequestBase request,
            HashMap<String,String> params,
            String encoding){
        byte[] ret = null;

        if (request != null) {

            if (params != null) {
                try {
                    //setEntity 用于设置提交的数据
                    //对于 key=value&key=value的形式,需要使用

                    LinkedList<NameValuePair> parameters = new LinkedList<NameValuePair>();

                    //TODO 添加参数
                    Set<String> keySet = params.keySet();
                    for (String key : keySet) {
                        String value = params.get(key);
                        parameters.add(new BasicNameValuePair(key, value));
                    }

                    //将 parameters 中的key->value 通过 URLEncodeFormEntity 进行组合
                    //形成 key=value&ksy=value 的形式(这种形式是服务器标准数据提交的格式

                    if (encoding == null) {
                        encoding = "utf-8";
                    }

                    UrlEncodedFormEntity entity
                            = new UrlEncodedFormEntity(parameters, encoding); // 必须使用 两个参数的构造方法

                    request.setEntity(entity);
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
            }

            HttpClient client = new DefaultHttpClient();
            try {
                HttpResponse response = client.execute(request);

                StatusLine statusLine = response.getStatusLine();

                if (statusLine.getStatusCode() == 200){
                    HttpEntity entity = response.getEntity();
                    ret = EntityUtils.toByteArray(entity);
                }
            }catch (IOException e){
                e.printStackTrace();
            }

        }
        return ret;
    }
}
